/**
 * 检查 git 暂存区中新增/重命名的文件是否符合 kebab-case 命名规范
 * 仅检查指定扩展名的文件
 */

const { execSync } = require('child_process');
const path = require('path');

// ✅ 允许的文件扩展名（按需修改）
const EXTENSIONS = [
  '.js',
  '.ts',
  '.jsx',
  '.tsx',
  '.vue',
  '.html',
  '.css',
  '.scss',
  '.less',
  '.json',
  '.md',
];

// ✅ 排除的文件（自动生成的文件不需要检查命名规范）
const EXCLUDED_FILES = [
  'auto-imports.d.ts', // unplugin-auto-import 自动生成的文件
];

// ✅ kebab-case 正则：只允许小写字母、数字，单词间用连字符分隔
// 示例：✅ user-profile.vue ❌ UserProfile.vue ❌ user_profile.js
const KEBAB_CASE_REGEX = /^[a-z0-9]+(-[a-z0-9]+)*\.[a-zA-Z0-9]+$/;

/**
 * 获取 git 暂存区中新增（A）或重命名（R）的文件
 */
function getStagedFiles() {
  try {
    // --diff-filter=ARC：只获取 Added, Renamed, Copied 的文件
    const output = execSync('git diff --cached --name-only --diff-filter=ARC', {
      encoding: 'utf8',
      stdio: 'pipe', // 避免输出干扰
    });
    return output.split('\n').filter(Boolean);
  } catch (error) {
    console.error('❌ 获取 git 暂存文件失败，请确保在 git 仓库中运行。');
    process.exit(1);
  }
}

/**
 * 检查文件名是否符合 kebab-case
 * @param {string} filename - 文件名（含扩展名）
 * @returns {boolean}
 */
function isValidFilename(filename) {
  return KEBAB_CASE_REGEX.test(filename);
}

// 🚀 开始检查
const stagedFiles = getStagedFiles();
const targetFiles = stagedFiles.filter(file => {
  return EXTENSIONS.some(ext => file.endsWith(ext));
});

const invalidFiles = targetFiles.filter(file => {
  const basename = path.basename(file); // 只检查文件名，不检查路径
  
  // 排除自动生成的文件
  if (EXCLUDED_FILES.includes(basename)) {
    return false;
  }
  
  return !isValidFilename(basename);
});

if (invalidFiles.length > 0) {
  console.error('\x1b[31m❌ [文件命名规范错误] 以下文件名不符合 kebab-case（连字符）规范：\x1b[0m');
  invalidFiles.forEach(f => console.error(`  ➤ ${f}`));
  console.error('');
  console.error('\x1b[33m💡 正确格式示例：\x1b[0m');
  console.error('   ✅ user-profile.vue');
  console.error('   ✅ api-service.ts');
  console.error('   ✅ utils.js');
  console.error('');
  console.error('\x1b[33m🚫 禁止格式：\x1b[0m');
  console.error('   ❌ UserProfile.vue');
  console.error('   ❌ user_profile.js');
  console.error('   ❌ myComponent.ts');
  console.error('');
  console.error('\x1b[36m📌 请重命名文件后重新 git add 并提交。\x1b[0m');
  process.exit(1); // 阻止 git commit
} else {
  console.log('✅ 所有新增/重命名文件名符合 kebab-case 规范');
}
